package com.agencia.jsf;
import java.util.List;

import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlInputHidden;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;


import agencia.Servicio;
import agencia.exceptions.PrecioInferiorException;
import agencia.persistencia.ServicioDAO;

public class AdministrarServiciosBean {

    private HtmlDataTable 		dataTable;
    private Servicio 			dataItem 	= new Servicio();
    private HtmlInputHidden 	dataItemId 	= new HtmlInputHidden();
    private HtmlInputHidden     dataItemIdPadre = new HtmlInputHidden();
    private HtmlInputHidden		dataItemTipoPadre = new HtmlInputHidden();
    private HtmlInputHidden		dataItemRedirect = new HtmlInputHidden();
	private List<Servicio> 		servicios;
	private Long 				idPadre 	= Long.valueOf(-1);
	private String				tipoPadre;
	private int 				cantidad 	= 0;
	private int 				proximoId	= 1;
	private String 				redirect;
	

	public AdministrarServiciosBean() throws PrecioInferiorException  {	
		
		traerRequest();
		cargar();
	}
	
	public void cargar() throws PrecioInferiorException {
		
		ServicioDAO servicioDAO = new ServicioDAO();		
		
		servicios = servicioDAO.findByIdPadre(getIdPadre());
		
		/*
		Servicio srv = new Servicio();
		srv.setId(Long.valueOf(getProximoId()));
		srv.setNombre("Ropa Blanca");
		srv.setPrecio(10);
		srv.setIdPadre(getIdPadre());
		srv.setTipoPadre(getTipoPadre());
		servicios.add(srv);
		*/
		cantidad = servicios.size();
		actualizarProximoId();
		
		/* Levantaria de la BD todos los servicios cuyo idPadre = this.idPadre
		 * y tipoPadre = this.tipoPadre
		 */	
	}
	
	public void actualizarProximoId(){
		proximoId++;		
	}
	
	public int getProximoId(){
		return proximoId;
	}
	
	public String crear() {
		dataItem = new Servicio();					
		
		cantidad++;
		dataItemId.setValue(new Long(cantidad));		
		
		return "editar";
	}

	public String editar() {
		// Obtengo la fila completa
	    dataItem = (Servicio) dataTable.getRowData();
	    dataItemId.setValue(dataItem.getId());
	
		return "editar";
	}
	private void persistirServicio(){
		ServicioDAO servicioDAO = new ServicioDAO();
		servicioDAO.getSession().beginTransaction().begin();
		servicioDAO.save(dataItem);
		
		servicioDAO.getSession().beginTransaction().commit();
	}
	
	public void traerRequest(){
		
		FacesContext context = FacesContext.getCurrentInstance();		
		HttpServletRequest request= (HttpServletRequest)context.getExternalContext().getRequest();
		Long idPadre = (Long)request.getSession().getAttribute("idPadre");		
		String tipoPadre = (String)request.getSession().getAttribute("tipoPadre");
		String accionTerminar = (String)request.getSession().getAttribute("accionTerminar");
		
		setIdPadre(idPadre);
		setTipoPadre(tipoPadre);
		setRedirect(accionTerminar);		
		
		dataItemIdPadre.setValue(new Long(getIdPadre()));
		dataItemTipoPadre.setValue(new String(getTipoPadre()));
		dataItemRedirect.setValue(new String(getRedirect()));		
	}
	
	public String guardar() throws PrecioInferiorException {
		
		traerRequest();
		dataItem.setIdPadre(Long.valueOf(dataItemIdPadre.getValue().toString()));
		dataItem.setTipoPadre(dataItemTipoPadre.getValue().toString());
		if (cantidad > servicios.size()){
			persistirServicio();
			//dataItem.setId(Long.valueOf(getProximoId()));			
			servicios.add(dataItem);
			actualizarProximoId();
		}
		
		return "listar";
	}
	private void eliminarServicio(){
		ServicioDAO servicioDAO = new ServicioDAO();
		servicioDAO.getSession().beginTransaction().begin();
		servicioDAO.delete(servicioDAO.findById( dataItem.getId()));
		servicioDAO.getSession().beginTransaction().commit();
		
	}
	public String eliminar(){
		dataItem = (Servicio) dataTable.getRowData();
		eliminarServicio();
		servicios.remove(dataItem);
		cantidad--;
		return "listar";
	}

	public String listar() {
		return null;
	}

	public String volver() {
		/*FacesContext.getCurrentInstance().getApplication().getNavigationHandler()
			.handleNavigation(FacesContext.getCurrentInstance(),null,"volver");*/
			
		/*ExternalContext extCon = FacesContext.getCurrentInstance().getExternalContext();
		HttpSession session = (HttpSession) extCon.getSession(true);
		session.invalidate();*/
		
		// Si se creo uno nuevo, vuelvo el conteo hacia atras
		cantidad = servicios.size();

		return "volver";
	}
	
	public String redireccion() {	
		
		traerRequest();
		
		return this.dataItemRedirect.getValue().toString();
	}
	
	public void actualizarLlamador(){
		
	}

	//-------------------------------------
	
	public HtmlDataTable getDataTable() {
		return dataTable;
	}

	public void setDataTable(HtmlDataTable dataTable) {
		this.dataTable = dataTable;
	}

	public Servicio getDataItem() {
		return dataItem;
	}

	public void setDataItem(Servicio dataItem) {
		this.dataItem = dataItem;
	}

	public HtmlInputHidden getDataItemId() {
		return dataItemId;
	}

	public void setDataItemId(HtmlInputHidden dataItemId) {
		this.dataItemId = dataItemId;
	}

	public int getCantidad() {
		return cantidad;
	}

	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}

	public List<Servicio> getServicios() throws PrecioInferiorException {
		traerRequest();
		cargar();
		return servicios;
	}

	public void setServicios(List<Servicio> servicios) {
		this.servicios = servicios;
	}
	
	public Long getIdPadre() {
		return idPadre;
	}

	public void setIdPadre(Long idPadre) {
		this.idPadre = idPadre;
	}

	public String getTipoPadre() {
		return tipoPadre;
	}

	public void setTipoPadre(String tipoPadre) {
		this.tipoPadre = tipoPadre;
	}

	public String getRedirect() {
		return redirect;
	}

	public void setRedirect(String redirect) {
		this.redirect = redirect;
	}

}
